package com.doubao.hardware.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;

import java.nio.charset.StandardCharsets;

/**
 * MQTT认证工具类
 * 用于生成百度IoT Core认证所需的用户名和密码
 */
@Slf4j
public class MqttAuthUtil {

    /**
     * 生成MQTT连接用户名
     *
     * @param iotCoreId IoT Core ID
     * @param deviceKey 设备标识
     * @param timestamp 时间戳，0表示不使用时间戳
     * @param algorithmType 算法类型，支持MD5/SHA1/SHA256
     * @return 用户名
     */
    public static String generateUsername(String iotCoreId, String deviceKey, long timestamp, String algorithmType) {
        if (timestamp > 0) {
            return "thingidp@" + iotCoreId + "|" + deviceKey + "|" + timestamp + "|" + algorithmType;
        } else {
            return "thingidp@" + iotCoreId + "|" + deviceKey + "|" + algorithmType;
        }
    }

    /**
     * 生成MQTT连接密码
     *
     * @param deviceKey 设备标识
     * @param timestamp 时间戳，0表示不使用时间戳
     * @param algorithmType 算法类型，支持MD5/SHA1/SHA256
     * @param deviceSecret 设备密钥
     * @return 密码
     */
    public static String generatePassword(String deviceKey, long timestamp, String algorithmType, String deviceSecret) {
        // 按照百度IoT Core的格式拼接内容 - 使用已知可用的格式
        String signContent = deviceKey + "&" + timestamp + "&" + algorithmType + deviceSecret;
        log.debug("Sign content: {}", signContent);

        try {
            switch (algorithmType.toUpperCase()) {
                case "MD5":
                    return md5(signContent);
                case "SHA1":
                    return DigestUtils.sha1Hex(signContent);
                case "SHA256":
                    return DigestUtils.sha256Hex(signContent);
                default:
                    log.warn("不支持的算法类型: {}, 使用默认MD5", algorithmType);
                    return md5(signContent);
            }
        } catch (Exception e) {
            log.error("生成密码失败", e);
            throw new RuntimeException("生成密码失败", e);
        }
    }

    /**
     * MD5加密方法
     *
     * @param input 输入字符串
     * @return MD5加密后的字符串
     */
    public static String md5(String input) {
        try {
            byte[] inputBytes = input.getBytes(StandardCharsets.UTF_8);
            String result = DigestUtils.md5Hex(inputBytes);
            log.debug("MD5 input: {}, result: {}", input, result);
            return result;
        } catch (Exception e) {
            log.error("MD5加密失败", e);
            throw new RuntimeException("MD5加密失败", e);
        }
    }
}